package Filters;


import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;


import FilesManagers.CantOpenFileException;
import FilesManagers.FileManager;
import FilesManagers.NoMoreLinesException;


public abstract class WordsFilter extends Filter{

	private String biblioteca;
	private char marcadorComentario;
	private char separadorPalabras;
	protected ArrayList<String> listaPalabras;
	


	protected ArrayList<String> getListaPalabras() {
		return listaPalabras;
	}

	public WordsFilter (String biblioteca) throws CantOpenFileException{
		this(biblioteca,'#',',');

	}

	public WordsFilter (String biblioteca,char marcadorComentario,char separadorPalabras) throws CantOpenFileException{
		 this.biblioteca = biblioteca;
		 this.marcadorComentario = marcadorComentario;
		 this.setSeparadorPalabras(separadorPalabras);
		 listaPalabras = new ArrayList<String>();
		 this.loadWords();
		 
	}



	private void loadWords() throws CantOpenFileException{
		String linea;
		String[] lista;
		FileManager manejadorArchivo = new FileManager();
		try{
			manejadorArchivo.cargarArchivo(this.biblioteca);
			manejadorArchivo.setMarcadorComentario(this.marcadorComentario);
	
			//try{
				while((linea= manejadorArchivo.obtenerSiguienteLinea())!=null){
	
						lista = linea.split(Character.toString(this.getSeparadorPalabras()));
						for(int pos=0; pos < lista.length ; pos++){
							/*Para no cargar repetidas*/
							if(this.listaPalabras.indexOf(lista[pos])==-1){
								this.listaPalabras.add(lista[pos]);
							}
	
						}
				}
				manejadorArchivo.cerrarArchivo();
				//Collections.sort(listaPalabras,  new WordsComparator());
				this.ordenarPalabras();
			}catch(NoMoreLinesException e){
				//System.out.println("TOTAL DE STOPWORDS= "+this.listaPalabras.size());
				manejadorArchivo.cerrarArchivo();
				this.ordenarPalabras();
				//Collections.sort(listaPalabras,  new WordsComparator());
			}
		/*}*/catch(CantOpenFileException e){
			throw e;
		}
		


	}
	protected abstract void ordenarPalabras();
	
	protected abstract String filterWords(String lineaOrigen);

	/*Si es un numero no necesito aplicarle filtro */ 
	protected boolean isNumber(String palabra){
		try{
			Integer.parseInt(palabra);
			return true;
		}catch(NumberFormatException e){
			return false;
			//System.out.println("Era numero, no lo limpio");
		}
		
	}

	public String procesarLinea(String linea){
		linea=filterWords(linea);
		return linea;


	}

	protected void setSeparadorPalabras(char separadorPalabras) {
		this.separadorPalabras = separadorPalabras;
	}

	protected char getSeparadorPalabras() {
		return separadorPalabras;
	}



}